import { useStorage } from '@/hook/useStorage';
import { AxiosResponseDataInterface } from '@/networkService/axiosInterface';
import networkService from '@/networkService/axiosInterceptors';
import { AxiosResponse } from 'axios';
import { allLogInterface } from '../systemLog/interface';
/**
 * 日志上传的功能函数
 * @author 莫若省
 * @param {object} logInfo - 日志信息对象
 */
export const uploadLogRequestUrl = '/uploadLog';
const uploadLog = async (logInfo: allLogInterface) => {
  if (!logInfo) return;
  try {
    const result = await networkService.post<
      AxiosResponse,
      AxiosResponseDataInterface
    >(uploadLogRequestUrl, logInfo);
    if (+result.code === 200) {
      clearLogInfo();
    }
  } catch (error) {
    console.error('上传日志出错:', error);
  }
};

/**
 * 获取全部日志的功能函数
 * @author 莫若省
 * @returns {object} - 包含不同类型日志的对象
 */
const getAllLogInfo = (): allLogInterface => {
  return {
    errorLog: useStorage.getItem('errorLog') || [],
    pageRouteLog: useStorage.getItem('pageRouteLog') || [],
    axiosLog: useStorage.getItem('axiosLog') || [],
  };
};

/**
 * 清除所有日志信息的功能函数
 * @author 莫若省
 */
const clearLogInfo = () => {
  ['errorLog', 'pageRouteLog', 'axiosLog'].forEach((logType) => {
    useStorage.removeItem(logType);
  });
};

/**
 * 运行定时任务的功能函数
 * 首次调用时创建一个新的时间戳，并检测上一次调用的时间戳与
 * 本次调用的间隔是否大于一个小时
 * @author 莫若省
 * isTaskRunning 用于控制是否执行定时任务
 */
const HOUR_IN_MILLISECONDS = 60 * 60 * 1000;
let isTaskRunning = false;

export const runHourlyTask = async () => {
  if (isTaskRunning) {
    return;
  }

  const currentTime = Date.now();
  let lastExecutionTime;
  const getLastExecutionTime = useStorage.getItem('hourlyTaskExecutionTime');
  if (getLastExecutionTime) lastExecutionTime = getLastExecutionTime;
  else {
    // 如果没有上次执行时间，则生成初始时间戳并存储
    lastExecutionTime = currentTime;
    useStorage.setItem('hourlyTaskExecutionTime', currentTime);
  }
  if (currentTime - lastExecutionTime >= HOUR_IN_MILLISECONDS) {
    isTaskRunning = true;

    try {
      await uploadLog(getAllLogInfo());
      useStorage.setItem('hourlyTaskExecutionTime', currentTime);
    } catch (error) {
      console.error('上传日志出错:', error);
      // 在此处可以执行更具体的错误处理，例如记录错误详细信息或通知用户
    } finally {
      isTaskRunning = false;
    }
  }
};

runHourlyTask();
setInterval(runHourlyTask, HOUR_IN_MILLISECONDS);
